Python3 您所在的位置:网站首页 python 同名方法 Python3

Python3

2023-09-30 02:39| 来源: 网络整理| 查看: 265

一.继承 (一)

编写类时,并非总是要从空白开始。如果你要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获取另一个类的所有属性和方法;原有的类称为父类(基类),而新类称为子类(派生类)。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

继承的意义:重用代码,方便代码的管理和修改

#类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people):#在括号中写父类名 grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade)) s = student('ken',10,60,3) s.speak()

执行结果:

ken 说: 我 10 岁了,我在读 3 年级

(二)继承的搜索

(三)重用父类的__init__()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手

class Rectangle(object): def __init__(self, width, length): # 实例化传参时 将初始化参数 self.width = width self.length = length def get_area(self): return self.width * self.length class Square(Rectangle): def __init__(self, width, length): if width == length: Rectangle.__init__(self, width, length) # 此处调用了父类方法,这里的self是正方形的实例,不是矩形的实例 else: print('长度和宽度不相等,不能成为正方形') square = Square(25, 25) square.get_area() square1 = Square(25, 22)

运行结果:

长度和宽度不相等,不能成为正方形 (三)Object,_ _bases__ 特殊属性

Object最顶层的类,类的老祖宗

_ _bases__ 特殊属性,反回的是父类

print(Square.__bases__) #执行结果:(,),因为Square的父类是Rectangle

为什么返回的是一个元组?

因为元组不可变

二.多继承

一个子类可以继承多个父类是多继承

一层层继承下去是多重继承

class Base(object): def play(self): print('Base is playing!') class A(Base): # 继承Base def play(self): # 自动覆盖父类的此方法 print('A is playing') class B(Base): # 继承Base def play(self): print('B is playing') class C(A, B): # 继承A,B pass c = C() c.play()

执行结果:

A is playing

通过C类实例的方法调用来看,当继承多个父类时,如果父类中有相同的方法,那么子类会优先使用最先被继承的方法

方法重写

当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

class Parent: # 定义父类 def myMethod(self): print('调用父类方法') class Child(Parent): # 定义子类 def myMethod(self): print('调用子类方法') c = Child() # 子类实例 c.myMethod() # 子类调用重写方法

当子类重写父类方法之后,子类如果想再次调用父类的方法,可以使用这两种方法

#方法一 class C(A, B): # 继承A,B def play(self): #覆盖父类 B.play(self) # 指定继承B类内的play方法 #方法二 class C(A, B): def play(self): super().play() print('这是C')

super()用法

super 函数可以调用父类的方法,在父类中也使用super函数之后,可以通过调用类的mro方法属性来查看继承关系

class Base(object): def play(self): print('Base is playing!') class A(Base): # 继承Base def play(self): # 自动覆盖父类的此方法 super().play() # 调用父类方法 print('A is playing!') a = A() a.play()

运行结果:

Base is playing! A is playing!在python3中,类被创建时会自动创建方法解析顺序mro,object是所有类的父类

类.mro() 查看继承顺序

print(A.mro())

运行结果:

[, , ]

练习1:

通过多重继承方法,分别定义出动物,人类,和和荷兰人三种类

class Animal(object): def __init__(self, name): self.name = name def eat(self): print('%s正在吃东西' % self.name) def breath(self): print('%s正在呼吸' % self.name) class Person(Animal): def __init__(self, name, money): super().__init__(name) self.money = money def speak(self): print('%s说他有%s人民币' % (self.name, self.money)) class Fulan(Person): def eat(self): print('弗兰人%s不仅爱吃辣,而且爱吃槟榔' % self.name) def speak(self): print('福兰人%s正在blablabla讲弗兰话。' % self.name) juhao = Fulan('句号', 23) juhao.breath() juhao.eat() juhao.speak()

运行结果:

句号正在呼吸 弗兰人句号不仅爱吃辣,而且爱吃槟榔 福兰人句号正在blablabla讲弗兰话。

练习2:

通过mix-in模式拼接一个Spiderman,可以尽量丰富这个类的属性和方法

class Animal(object): def __init__(self, name): self.name = name def eat(self): print('%s正在吃东西' % self.name) def breath(self): print('%s正在呼吸' % self.name) class Person(Animal): def __init__(self, name, money): super().__init__(name) self.money = money def speak(self): print('%s说他有%s人民币' % (self.name, self.money)) class Spider(Animal): def climb(self): print('%s正在攀岩' % self.name) def tusi(self): print('%s正在吐丝' % self.name) class Spiderman(Person, Spider): pass Spiderman = Spiderman('Spiderman', 10) Spiderman.tusi() Spiderman.climb() Spiderman.eat() Spiderman.breath()

运行结果:

Spiderman正在吐丝 Spiderman正在攀岩 Spiderman正在吃东西 Spiderman正在呼吸



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有